package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.constant.MessageConstant;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.mapper.CheckGroupMapper;
import com.itheima.pojo.CheckGroup;
import com.itheima.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Service(interfaceClass = CheckGroupService.class)
public class CheckGroupServiceImpl implements CheckGroupService {

    @Autowired
    private CheckGroupMapper checkGroupMapper;

    /**
     * 新增检查组
     * 主键回显设置，能够给与checkgroup的id值（此值在sql语句中为null）
     * 好处是少查询一次
     * @param checkGroup
     * @param checkitemIds
     */
    @Override
    public void add(CheckGroup checkGroup, Integer[] checkitemIds) {

        checkGroupMapper.add(checkGroup);
        setCheckGroupAndCheckItem(checkGroup.getId(), checkitemIds);

    }

    /**
     * 通过页码数和查询条件获取检查组列表
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {

        //使用mybatis的分页插件,查询语句会自动拦截，所以顺序不会变
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        List<CheckGroup> checkGroupList = checkGroupMapper.findByCondition(queryPageBean.getQueryString());
        PageInfo<CheckGroup> pageInfo = new PageInfo<>(checkGroupList);

        return new PageResult(pageInfo.getTotal(), pageInfo.getList());
    }

    /**
     * 根据id删除检查组
     * 1.查看其检查套餐中有无连接
     * 2.清除其在中间表的数据
     * 3.删除数据
     * @param id
     */
    @Override
    public void deleteById(Integer id) {
        Integer count = checkGroupMapper.findCountByCheckGroupId(id);
        if (count > 0) {
            throw new RuntimeException(MessageConstant.CHECKGROUP_IS_QUOTED);
        }
        checkGroupMapper.clearCheckGroupIdinCheckGroupAndCheckItem(id);
        checkGroupMapper.deleteById(id);
    }

    /**
     * 根据id获取检查组CheckGroup
     *
     * @param id
     * @return
     */
    @Override
    public CheckGroup findById(Integer id) {
        return checkGroupMapper.findById(id);
    }

    /**
     * 从中间表获取改检查组包含的检查项的id数组
     *
     * @param id
     * @return
     */
    @Override
    public List<Integer> findCheckItemIdsByCheckGroupId(Integer id) {
        return checkGroupMapper.findCheckItemIdsByCheckGroupId(id);
    }

    /**
     * 应用检查组中编辑变动以及中间表的对应关系
     * 1.更新检查组(改)
     * 2.清除该组在中间表中的数据（删）
     * 3.调用setCheckGroupAndCheckItem方法，应用新数据（增）
     * @param checkGroup
     * @param checkItemIds
     */
    @Override
    public void edit(CheckGroup checkGroup, Integer[] checkItemIds) {
        checkGroupMapper.edit(checkGroup);
        checkGroupMapper.clearCheckGroupIdinCheckGroupAndCheckItem(checkGroup.getId());
        setCheckGroupAndCheckItem(checkGroup.getId(), checkItemIds);
    }

    /**
     * 获取全部检查组
     *
     * @return
     */
    @Override
    public List<CheckGroup> findAll() {
        return checkGroupMapper.findAll();
    }

    /**
     * 在中间表添加
     * 如果检查组没有添加成功，或者检查组没有绑定任何一个检查项，那么就不能执行中间表的添加
     * 于是要判断
     * @param id 为null时不添加
     * @param checkitemIds 为0的时候不添加
     */
    private void setCheckGroupAndCheckItem(Integer id, Integer[] checkitemIds) {
        if (id != 0 & (checkitemIds != null & checkitemIds.length > 0)) {
            // for (Integer checkitemId : checkitemIds) {
            //     checkGroupMapper.setCheckGroupAndCheckItem(id, checkitemId);
            // }
            checkGroupMapper.setCheckGroupAndCheckItem(id, checkitemIds);
        }
    }

}
